home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / graphics / mandelv2.5 < prev    next >
Internet Message Format  |  1989-06-21  |  54KB

  1. Path: xanth!ames!oliveb!sun!swap!page
  2. From: page%swap@Sun.COM (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i156:  mandelvroom - mandelbrot explorer v2.0, Part05/09
  5. Message-ID: <111390@sun.Eng.Sun.COM>
  6. Date: 21 Jun 89 04:01:37 GMT
  7. Sender: news@sun.Eng.Sun.COM
  8. Lines: 2135
  9. Approved: page@sun.com
  10.  
  11. Submitted-by: kevin@uts.amdahl.com (Kevin Clague)
  12. Posting-number: Volume 89, Issue 156
  13. Archive-name: graphics/mandelv20.5
  14.  
  15. # This is a shell archive.
  16. # Remove anything above and including the cut line.
  17. # Then run the rest of the file through 'sh'.
  18. # Unpacked files will be owned by you and have default permissions.
  19. #----cut here-----cut here-----cut here-----cut here----#
  20. #!/bin/sh
  21. # shar: SHell ARchive
  22. # Run the following text through 'sh' to create:
  23. #    mand881.c
  24. #    mandffp.c
  25. #    mandieee.c
  26. #    mandint32.c
  27. #    mandp.h
  28. # This is archive 5 of a 9-part kit.
  29. # This archive created: Tue Jun 20 20:45:29 1989
  30. echo "extracting mand881.c"
  31. sed 's/^X//' << \SHAR_EOF > mand881.c
  32. X/*
  33. X * MandelVroom 2.0
  34. X *
  35. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  36. X *
  37. X * All rights reserved.
  38. X *
  39. X * Permission is hereby granted to distribute this program's source
  40. X * executable, and documentation for non-comercial purposes, so long as the
  41. X * copyright notices are not removed from the sources, executable or
  42. X * documentation.  This program may not be distributed for a profit without
  43. X * the express written consent of the author Kevin L. Clague.
  44. X *
  45. X * This program is not in the public domain.
  46. X *
  47. X * Fred Fish is expressly granted permission to distribute this program's
  48. X * source and executable as part of the "Fred Fish freely redistributable
  49. X * Amiga software library."
  50. X *
  51. X * Permission is expressly granted for this program and it's source to be
  52. X * distributed as part of the Amicus Amiga software disks, and the
  53. X * First Amiga User Group's Hot Mix disks.
  54. X *
  55. X * contents: this file contains the function that calculates the
  56. X * Mandelbrot/Julia caluclation in 68881 assembly.  This funtion needs
  57. X * work, so that it is all assembly instead of C and assembly.
  58. X */
  59. X
  60. X#include "mandp.h"
  61. X#include "parms.h"
  62. X
  63. XHeight_68881( p )
  64. X  struct PotentialParms *p;
  65. X{
  66. X  register LONG k;
  67. X  register double *P;
  68. X
  69. X  k = p->MaxIteration;
  70. X
  71. X  P = (double *) p;
  72. X
  73. X#asm
  74. X;       mc68881
  75. X;
  76. X;four     equ   fp1
  77. X;curx     equ   fp2
  78. X;cury     equ   fp3
  79. X;cura     equ   fp4
  80. X;curb     equ   fp5
  81. X;cura2    equ   fp6
  82. X;curb2    equ   fp7
  83. X;
  84. X;
  85. X;  set up modulus
  86. X        fmove.d #"$4010000000000000",fp1
  87. X;
  88. X;  move posx and posy into fp4 and fp5
  89. X;  move curx and cury into fp2 and fp3
  90. X;
  91. X        fmove.d (a2)+,fp4
  92. X        fmove.d (a2)+,fp5
  93. X        fmove.d (a2)+,fp2
  94. X        fmove.d (a2),fp3
  95. X;
  96. X        fmove.x fp4,fp6
  97. X        fmove.x fp5,fp7
  98. X        fmul.x  fp6,fp6
  99. X        fmul.x  fp7,fp7
  100. XLoop
  101. X;
  102. X;    curb *= cura;
  103. X;    curb += curb + cury;
  104. X        fmul.x  fp4,fp5
  105. X        fadd.x  fp5,fp5
  106. X        fadd.x  fp3,fp5
  107. X;
  108. X;    cura = cura2 - curb2 + curx
  109. X        fsub.x  fp7,fp6
  110. X        fadd.x  fp2,fp6
  111. X;
  112. X;    curb2 = curb * curb;
  113. X        fmove.x fp5,fp7
  114. X        fmul.x  fp5,fp7
  115. X;
  116. X;    cura2 = cura * cura;
  117. X        fmove.x fp6,fp4
  118. X        fmul.x  fp6,fp6
  119. X;
  120. X;    if (cura2+curb2 > 4.0)
  121. X;      return( k );
  122. X        fmove.x fp6,fp0
  123. X        fadd.x  fp7,fp0
  124. X        fcmp.x  fp1,fp0
  125. X        fdbgt   d4,Loop
  126. X;       addq.l  #2,d4
  127. X;
  128. X#endasm
  129. X     ;
  130. X     return( p->MaxIteration - k );
  131. X}
  132. SHAR_EOF
  133. echo "extracting mandffp.c"
  134. sed 's/^X//' << \SHAR_EOF > mandffp.c
  135. X/*
  136. X * MandelVroom 2.0
  137. X *
  138. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  139. X *
  140. X * All rights reserved.
  141. X *
  142. X * Permission is hereby granted to distribute this program's source
  143. X * executable, and documentation for non-comercial purposes, so long as the
  144. X * copyright notices are not removed from the sources, executable or
  145. X * documentation.  This program may not be distributed for a profit without
  146. X * the express written consent of the author Kevin L. Clague.
  147. X *
  148. X * This program is not in the public domain.
  149. X *
  150. X * Fred Fish is expressly granted permission to distribute this program's
  151. X * source and executable as part of the "Fred Fish freely redistributable
  152. X * Amiga software library."
  153. X *
  154. X * Permission is expressly granted for this program and it's source to be
  155. X * distributed as part of the Amicus Amiga software disks, and the
  156. X * First Amiga User Group's Hot Mix disks.
  157. X *
  158. X * contents:  this file contains the routines to calculate Mandelbrot and
  159. X * Julia pictures in Amiga Fast Floating Point.
  160. X */
  161. X
  162. X#include "mandp.h"
  163. X
  164. Xextern SHORT MaxOrbit;
  165. X
  166. Xstatic LONG MaxIter;
  167. X
  168. X/*
  169. X * Fast Floating Point Mandelbrot Generator
  170. X */
  171. XMandelbrotFFP( Pict, StartX, StartY, GapX, GapY )
  172. X  /*
  173. X   * These parameters are IEEE 32 bit floating point numbers
  174. X   */
  175. X
  176. X  struct Picture *Pict;
  177. X
  178. X  LONG  StartX, StartY, GapX, GapY;
  179. X{
  180. X  register int i, j, k;
  181. X  register SHORT *CountPtr;
  182. X
  183. X  register float curx, cury;
  184. X
  185. X  float startx, starty, gapx, gapy;
  186. X  float SPFieee();
  187. X
  188. X  UBYTE MandFlag;
  189. X
  190. X  /* Here we convert the IEEE parameters into FFP format */
  191. X
  192. X  startx = SPFieee( StartX );
  193. X  starty = SPFieee( StartY );
  194. X  gapx   = SPFieee( GapX );
  195. X  gapy   = SPFieee( GapY );
  196. X
  197. X  MaxIter = Pict->MaxIteration;
  198. X
  199. X  if (Pict->Flags & NO_RAM_GENERATE)
  200. X    CountPtr = Pict->Counts;
  201. X  else
  202. X    CountPtr = Pict->Counts + Pict->CurLine*Pict->CountX;
  203. X
  204. X  /* start in the upper left hand corner */
  205. X
  206. X  cury = starty;
  207. X
  208. X  /*
  209. X   * for each row
  210. X   */
  211. X  for (i = Pict->CurLine; i < Pict->CountY; i++) {
  212. X
  213. X    curx = startx;
  214. X
  215. X    MandFlag = 0;
  216. X
  217. X    if ( Pict->Flags & NO_RAM_GENERATE )
  218. X      CountPtr = Pict->Counts;
  219. X
  220. X    /*
  221. X     * for each collumn
  222. X     */
  223. X
  224. X    for (j = 0; j < Pict->CountX; j++) {
  225. X
  226. X     /* if we've hit a Mandelbrot point, then use the convergence detector,
  227. X      *  to reduce compute time
  228. X      */
  229. X
  230. X      if (*CountPtr == 0) {
  231. X
  232. X        if ( MandFlag ) {
  233. X
  234. X          k = FFP_Trace_Height( 0.0, 0.0, curx, cury );
  235. X
  236. X        } else {
  237. X
  238. X          k = FFP_Height( 0.0, 0.0, curx, cury ); /* Normal calculator */
  239. X        }
  240. X
  241. X        MandFlag = k == Pict->MaxIteration;
  242. X
  243. X        *CountPtr = k;        /* save it in ram for recoloring */
  244. X      }
  245. X      CountPtr++;
  246. X
  247. X      curx += gapx;
  248. X
  249. X      ChildPause( Pict );
  250. X    }
  251. X    cury += gapy;
  252. X
  253. X    CheckEOL( Pict );
  254. X  }
  255. X} /* Mandelbrot */
  256. X
  257. X/***************************************************************************
  258. X *
  259. X *           Julia Curve Generator that uses Amiga Fast Floating Point
  260. X *
  261. X **************************************************************************/
  262. X
  263. X/*
  264. X * Fast Floating Point Julia Generator
  265. X */
  266. XJuliaFFP( Pict, JuliaX, JuliaY, StartX, StartY, GapX, GapY )
  267. X
  268. X  /*
  269. X   * These parameters are IEEE 32 bit floating point numbers
  270. X   */
  271. X
  272. X  register struct Picture *Pict;
  273. X  LONG  JuliaX, JuliaY;
  274. X  LONG  StartX, StartY;
  275. X  LONG  GapX,   GapY;
  276. X{
  277. X  register int i, j, k;
  278. X  register float curx, cury;
  279. X
  280. X  register SHORT *CountPtr;
  281. X
  282. X  float juliax, juliay, gapx, gapy,startx;
  283. X  float SPFieee();
  284. X
  285. X  UBYTE ConvFlag;
  286. X
  287. X  MaxIter = Pict->MaxIteration;
  288. X
  289. X  if (Pict->Flags & NO_RAM_GENERATE)
  290. X    CountPtr = Pict->Counts;
  291. X  else
  292. X    CountPtr = Pict->Counts + Pict->CurLine*Pict->CountX;
  293. X
  294. X  /* Here we convert the IEEE parameters into FFP format */
  295. X
  296. X  juliax = SPFieee( JuliaX );
  297. X  juliay = SPFieee( JuliaY );
  298. X
  299. X  gapx = SPFieee( GapX );
  300. X  gapy = SPFieee( GapY );
  301. X
  302. X  /* start in the upper left hand corner */
  303. X
  304. X  startx = SPFieee(StartX);
  305. X  cury   = SPFieee(StartY);
  306. X
  307. X  /* move down to next not generated line */
  308. X
  309. X  cury += Pict->CurLine*gapy;
  310. X
  311. X  /*
  312. X   * for each row
  313. X   */
  314. X  for (i = Pict->CurLine; i < Pict->CountY; i++) {
  315. X
  316. X    curx = startx;
  317. X    ConvFlag = 0;
  318. X
  319. X    if ( Pict->Flags & NO_RAM_GENERATE )
  320. X      CountPtr = Pict->Counts;
  321. X
  322. X    /*
  323. X     * for each collumn
  324. X     */
  325. X
  326. X    for (j = 0; j < Pict->CountX; j++) {
  327. X
  328. X     /* if we've hit a Mandelbrot point, then use the convergence detector,
  329. X      *  to reduce compute time
  330. X      */
  331. X
  332. X      if (*CountPtr == 0) {
  333. X
  334. X        if (ConvFlag) {
  335. X                                           /* try the convergence method */
  336. X          k = FFP_Trace_Height( curx, cury, juliax, juliay);
  337. X        } else {
  338. X          k = FFP_Height( curx, cury, juliax, juliay);      /* Normal calc */
  339. X        }
  340. X
  341. X        ConvFlag = k == Pict->MaxIteration;
  342. X
  343. X        *CountPtr = k;        /* save it in ram for recoloring */
  344. X      }
  345. X      CountPtr++;
  346. X
  347. X      curx += gapx;
  348. X
  349. X      ChildPause( Pict );
  350. X    }
  351. X    cury += gapy;
  352. X
  353. X    CheckEOL( Pict );
  354. X  }
  355. X} /* JuliaFFP */
  356. X
  357. X/*
  358. X * This function calculated the 'potential' of a given location
  359. X * in the complex plane.
  360. X */
  361. Xint
  362. XFFP_Height( posx, posy, juliax, juliay )
  363. X  float posx;    /* Location in screen coordinate space         */
  364. X  float posy;    /* Location in screen coordinate space         */
  365. X  float juliax;  /* Real part of location on complex plane      */
  366. X  float juliay;  /* Imaginary part of location on complex plane */
  367. X{
  368. X  register float cura, curb;
  369. X  register float cura2, curb2;
  370. X  register LONG k;
  371. X
  372. X#ifdef CHECK_TASK_STACK
  373. X
  374. X  CheckStack();
  375. X
  376. X#endif
  377. X
  378. X  cura = cura2 = posx;
  379. X  curb = curb2 = posy;
  380. X
  381. X  cura2 *= cura2;
  382. X  curb2 *= curb2;
  383. X
  384. X  for (k = 0; k < MaxIter; k ++ ) {
  385. X
  386. X    curb *= cura;                     /* b = 2 * a * b  + juliay    */
  387. X    curb += curb + juliay;
  388. X
  389. X    cura = cura2 - curb2 + juliax;    /* a = a2 - b2 + juliax       */
  390. X
  391. X    cura2 = cura * cura;              /* a2 = a * a                 */
  392. X    curb2 = curb * curb;              /* b2 = b * b                 */
  393. X
  394. X    if (cura2+curb2 >= 16.0)          /* quit if a2+b2 is too big   */
  395. X      return( k );
  396. X  }
  397. X  return( k );
  398. X}
  399. X
  400. X/*
  401. X * this is also a Mandelbrot potential calculator, that is tailored to
  402. X * identify points that are 'in' the Mandelbrot set.  Points outside the
  403. X * Mandelbrot set diverge.  Points inside converge.
  404. X * This code uses a trace table mechanism to detect convergence.
  405. X */
  406. Xint
  407. XFFP_Trace_Height( posx, posy, curx, cury )
  408. X
  409. X  float posx;    /* Real part of location on complex plane      */
  410. X  float posy;    /* Imaginary part of location on complex plane */
  411. X
  412. X  float curx;    /* Real part of location on complex plane      */
  413. X  float cury;    /* Imaginary part of location on complex plane */
  414. X{
  415. X  LONG  k, l;
  416. X
  417. X  LONG TraceSize = 32;
  418. X
  419. X  float olda[32], oldb[32]; /* Convergence trace table */
  420. X
  421. X  register float cura, curb, cura2, curb2;
  422. X  register float *RealTrace, *ImagTrace;
  423. X
  424. X#ifdef CHECK_TASK_STACK
  425. X
  426. X  CheckStack();
  427. X
  428. X#endif
  429. X
  430. X  cura = cura2 = posx;
  431. X  curb = curb2 = posy;
  432. X
  433. X  cura2 *= cura2;
  434. X  curb2 *= curb2;
  435. X
  436. X  for (k = 0; k < MaxIter; k += TraceSize) {
  437. X
  438. X    RealTrace = olda;
  439. X    ImagTrace = oldb;
  440. X
  441. X    for (l = 0; l < TraceSize; l++) {
  442. X
  443. X      *(RealTrace++) = cura;
  444. X      *(ImagTrace++) = curb;
  445. X
  446. X      curb *= cura;
  447. X      curb += curb + cury;
  448. X
  449. X      cura = cura2 - curb2 + curx;
  450. X
  451. X      cura2 = cura * cura;
  452. X      curb2 = curb * curb;
  453. X
  454. X      if (cura2+curb2 >= 16.0)
  455. X        return( k + l );
  456. X    }
  457. X
  458. X    /* Scope out trace table for convergence */
  459. X
  460. X    RealTrace = olda;
  461. X    ImagTrace = oldb;
  462. X
  463. X    for (l = 0; l < TraceSize; l++)
  464. X
  465. X      if (cura == *(RealTrace++) && curb == *(ImagTrace++)) {
  466. X        k += MaxIter;
  467. X        return( MaxIter );
  468. X      }
  469. X  }
  470. X  return( MaxIter );
  471. X}
  472. X
  473. XDrawOrbitFFP( Pict, creal, cimag, zreal, zimag )
  474. X  register struct Picture *Pict;
  475. X  LONG zreal, zimag, creal, cimag;
  476. X{
  477. X  register struct RastPort *Rp;
  478. X  register float cura,  curb;
  479. X           float cura2, curb2;
  480. X           float Creal, Cimag;
  481. X
  482. X  float x_scale, y_scale;
  483. X  int x_center, y_center;
  484. X  int width, height;
  485. X  int x, y;
  486. X  register int k;
  487. X
  488. X  struct Window *Window;
  489. X
  490. X  Window = OrbitWind;
  491. X
  492. X  Rp = Window->RPort;
  493. X
  494. X  width  = (Window->Width-Pict->LeftMarg-Pict->RightMarg);
  495. X  height = (Window->Height-Pict->TopMarg-Pict->BotMarg);
  496. X
  497. X  x_center = width/2 + Pict->LeftMarg;
  498. X  y_center = height/2 + Pict->TopMarg;
  499. X
  500. X  y_scale = x_scale = (float) height / 2.0;
  501. X/*x_scale *= AspectRatio( Pict );*/
  502. X
  503. X  if ( Pict->pNode.ln_Type == MANDPICT ) {
  504. X
  505. X    Creal = SPFieee(creal);
  506. X    Cimag = SPFieee(cimag);
  507. X
  508. X    cura = cura2 = SPFieee(zreal);
  509. X    curb = curb2 = SPFieee(zimag);
  510. X
  511. X  } else {
  512. X
  513. X    Creal = SPFieee(zreal);
  514. X    Cimag = SPFieee(zimag);
  515. X
  516. X    cura = cura2 = SPFieee(creal);
  517. X    curb = curb2 = SPFieee(cimag);
  518. X
  519. X  }
  520. X
  521. X  cura2 *= cura2;
  522. X  curb2 *= curb2;
  523. X
  524. X  SetAPen( Rp, 0 );
  525. X  RectFill( Rp, Pict->LeftMarg, Pict->TopMarg, width+Pict->LeftMarg-1, height+Pict->TopMarg-1);
  526. X
  527. X  SetAPen( Rp, HIGHLIGHTPEN);
  528. X
  529. X  for (k = 0; k < MaxOrbit; k++ ) {
  530. X
  531. X    curb *= cura;
  532. X    curb += curb + Cimag;
  533. X
  534. X    cura  = cura2 - curb2 + Creal;
  535. X
  536. X    cura2 = cura * cura;
  537. X    curb2 = curb * curb;
  538. X
  539. X    if (cura2+curb2 >= 16.0)
  540. X      return( k );
  541. X
  542. X    /* map real and imaginary parts into window coordinates */
  543. X
  544. X    x = x_center + (int)(x_scale*cura);
  545. X    y = y_center + (int)(y_scale*curb);
  546. X
  547. X    if ( x >= Pict->LeftMarg && x < Window->Width-Pict->RightMarg &&
  548. X         y >= Pict->TopMarg  && y < Window->Height-Pict->BotMarg ) {
  549. X
  550. X      /* plot pixel location */
  551. X      WritePixel( Rp, x, y);
  552. X    }
  553. X
  554. X  }
  555. X  return( k );
  556. X}
  557. X
  558. X
  559. X
  560. SHAR_EOF
  561. echo "extracting mandieee.c"
  562. sed 's/^X//' << \SHAR_EOF > mandieee.c
  563. X/*
  564. X * MandelVroom 2.0
  565. X *
  566. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  567. X *
  568. X * All rights reserved.
  569. X *
  570. X * Permission is hereby granted to distribute this program's source
  571. X * executable, and documentation for non-comercial purposes, so long as the
  572. X * copyright notices are not removed from the sources, executable or
  573. X * documentation.  This program may not be distributed for a profit without
  574. X * the express written consent of the author Kevin L. Clague.
  575. X *
  576. X * This program is not in the public domain.
  577. X *
  578. X * Fred Fish is expressly granted permission to distribute this program's
  579. X * source and executable as part of the "Fred Fish freely redistributable
  580. X * Amiga software library."
  581. X *
  582. X * Permission is expressly granted for this program and it's source to be
  583. X * distributed as part of the Amicus Amiga software disks, and the
  584. X * First Amiga User Group's Hot Mix disks.
  585. X *
  586. X * contents: this file contains the Mandelbrot and Julia picture generators
  587. X * in IEEE floating point format.
  588. X */
  589. X
  590. X#include "mandp.h"
  591. X#include "parms.h"
  592. X
  593. Xextern SHORT MaxOrbit;
  594. X
  595. Xextern char *IEEELib;
  596. X
  597. X/*
  598. X * IEEE Floating Point Mandelbrot Generator
  599. X */
  600. Xint
  601. XMandelbrotIEEE( Pict )
  602. X  register struct Picture *Pict;
  603. X{
  604. X  register int i, j, k;
  605. X  register SHORT *CountPtr;
  606. X  register int  MathMode;
  607. X
  608. X  struct PotentialParms Parms;
  609. X  struct RastPort *Rp;
  610. X
  611. X  struct MathIeeeDoubBasBase *LocalMathBase;
  612. X
  613. X  LocalMathBase = (struct MathIeeeDoubBasBase *) OpenLibrary( IEEELib, 0L );
  614. X
  615. X  if (LocalMathBase == NULL)
  616. X    return;
  617. X
  618. X  MathMode = Pict->MathMode;
  619. X
  620. X  if (Pict->Flags & NO_RAM_GENERATE)
  621. X    CountPtr = Pict->Counts;
  622. X  else
  623. X    CountPtr = Pict->Counts + (Pict->CurLine*Pict->CountX);
  624. X
  625. X  Parms.ScreenReal = Pict->Real;
  626. X  Parms.ScreenImag = Pict->Imag;
  627. X
  628. X  /* start in the upper left hand corner */
  629. X
  630. X  Parms.C_Imag = Pict->ImagLow;
  631. X  Parms.C_Imag += Pict->CurLine*Pict->ImagGap;
  632. X
  633. X  Parms.MaxIteration = Pict->MaxIteration;
  634. X
  635. X  /*
  636. X   * for each pixel, calculate mandelbrot
  637. X   */
  638. X  for (i = Pict->CurLine; i < Pict->CountY; i++) {
  639. X
  640. X    Parms.C_Real = Pict->RealLow;
  641. X
  642. X    if ( Pict->Flags & NO_RAM_GENERATE )
  643. X      CountPtr = Pict->Counts;
  644. X
  645. X    for (j = 0; j < Pict->CountX; j++) {
  646. X
  647. X      if (*CountPtr == 0) {
  648. X        if (MathMode == 4) {
  649. X          k = Height_68881( &Parms );
  650. X        } else {
  651. X          k = IEEE_Height( &Parms );
  652. X        }
  653. X
  654. X        *CountPtr = k;
  655. X      }
  656. X      CountPtr++;
  657. X
  658. X      Parms.C_Real += Pict->RealGap;
  659. X
  660. X      ChildPause( Pict );
  661. X    }
  662. X    Parms.C_Imag += Pict->ImagGap;
  663. X
  664. X    CheckEOL( Pict );
  665. X  }
  666. X  CloseLibrary( LocalMathBase );
  667. X} /* MandelbrotIEEE */
  668. X
  669. X/*
  670. X * IEEE Floating Point Juliaelbrot Generator
  671. X */
  672. XJuliaIEEE( Pict )
  673. X  register struct Picture *Pict;
  674. X{
  675. X  register int i, j, k;
  676. X  register SHORT *CountPtr;
  677. X
  678. X  struct PotentialParms Parms;
  679. X
  680. X  struct MathIeeeDoubBasBase *LocalMathBase;
  681. X
  682. X  LocalMathBase = (struct MathIeeeDoubBasBase *) OpenLibrary( IEEELib, 0L );
  683. X
  684. X  if (Pict->Flags & NO_RAM_GENERATE)
  685. X    CountPtr = Pict->Counts;
  686. X  else
  687. X    CountPtr = Pict->Counts + (Pict->CurLine*Pict->CountX);
  688. X
  689. X  Parms.C_Real = Pict->Real;
  690. X  Parms.C_Imag = Pict->Imag;
  691. X  Parms.C_Imag += Pict->CurLine*Pict->ImagGap;
  692. X
  693. X  /* start in the upper left hand corner */
  694. X  Parms.ScreenImag = Pict->ImagLow;
  695. X
  696. X  Parms.MaxIteration = Pict->MaxIteration;
  697. X
  698. X  /*
  699. X   * for each pixel, calculate mandelbrot
  700. X   */
  701. X  for (i = Pict->CurLine; i < Pict->CountY; i++) {
  702. X
  703. X    Parms.ScreenReal = Pict->RealLow;
  704. X
  705. X    if ( Pict->Flags & NO_RAM_GENERATE )
  706. X      CountPtr = Pict->Counts;
  707. X
  708. X    for (j = 0; j < Pict->CountX; j++) {
  709. X
  710. X      if (*CountPtr == 0) {
  711. X        if (Pict->MathMode == 2) {
  712. X          k = IEEE_Height( &Parms );
  713. X        } else {
  714. X          k = Height_68881( &Parms );
  715. X        }
  716. X
  717. X        *CountPtr = k;
  718. X      }
  719. X      CountPtr++;
  720. X
  721. X      Parms.ScreenReal += Pict->RealGap;
  722. X
  723. X      ChildPause( Pict );
  724. X    }
  725. X    Parms.ScreenImag += Pict->ImagGap;
  726. X
  727. X    CheckEOL( Pict );
  728. X  }
  729. X  CloseLibrary( LocalMathBase );
  730. X} /* JuliaIEEE */
  731. X
  732. XIEEE_Height( Parms )
  733. X  register struct PotentialParms *Parms;
  734. X{
  735. X  register double cura,  curb;
  736. X           double cura2, curb2;
  737. X
  738. X  int k;
  739. X
  740. X#ifdef CHECK_TASK_STACK
  741. X
  742. X  CheckStack();
  743. X
  744. X#endif
  745. X
  746. X  cura = cura2 = Parms->ScreenReal;
  747. X  curb = curb2 = Parms->ScreenImag;
  748. X
  749. X  cura2 *= cura2;
  750. X  curb2 *= curb2;
  751. X
  752. X  for (k = 0; k < Parms->MaxIteration; k++ ) {
  753. X
  754. X    curb *= cura;
  755. X    curb += curb + Parms->C_Imag;
  756. X
  757. X    cura = cura2 - curb2 + Parms->C_Real;
  758. X
  759. X    cura2 = cura * cura;
  760. X    curb2 = curb * curb;
  761. X
  762. X    if (cura2+curb2 >= 16.0)
  763. X      return( k );
  764. X  }
  765. X  return( k );
  766. X}
  767. X
  768. XDrawOrbitIEEE( Pict )
  769. X  register struct Picture *Pict;
  770. X{
  771. X  register struct RastPort *Rp;
  772. X  register double cura,  curb;
  773. X           double cura2, curb2;
  774. X           double realc, imagc;
  775. X  register int k;
  776. X  double x_scale, y_scale;
  777. X  int x_center, y_center;
  778. X  int width, height;
  779. X  int x, y;
  780. X
  781. X  struct Window *Window;
  782. X
  783. X  Window = OrbitWind;
  784. X
  785. X  Rp = Window->RPort;
  786. X
  787. X  width  = (Window->Width-Pict->LeftMarg-Pict->RightMarg);
  788. X  height = (Window->Height-Pict->TopMarg-Pict->BotMarg);
  789. X
  790. X  x_center = width/2 + Pict->LeftMarg;
  791. X  y_center = height/2 + Pict->TopMarg;
  792. X
  793. X  y_scale = x_scale = (float) height / 2.0;
  794. X/*x_scale *= AspectRatio( Pict );*/
  795. X
  796. X  realc = Pict->RealLow + (float) (MouseX-Pict->LeftMarg) * Pict->RealGap;
  797. X  imagc = Pict->ImagLow + (float) (MouseY-Pict->TopMarg)  * Pict->ImagGap;
  798. X
  799. X  if ( Pict->pNode.ln_Type == MANDPICT ) {
  800. X
  801. X    cura = cura2 = Pict->Real;
  802. X    curb = curb2 = Pict->Imag;
  803. X
  804. X  } else {
  805. X
  806. X    cura = cura2 = realc;
  807. X    curb = curb2 = imagc;
  808. X    realc = Pict->Real;
  809. X    imagc = Pict->Imag;
  810. X  }
  811. X
  812. X  cura2 *= cura2;
  813. X  curb2 *= curb2;
  814. X
  815. X  SetAPen( Rp, 0 );
  816. X  RectFill( Rp, Pict->LeftMarg, Pict->TopMarg, width+Pict->LeftMarg-1, height+Pict->TopMarg-1);
  817. X
  818. X  SetAPen( Rp, HIGHLIGHTPEN);
  819. X
  820. X  for (k = 0; k < MaxOrbit; k++ ) {
  821. X
  822. X    curb *= cura;
  823. X    curb += curb + imagc;
  824. X
  825. X    cura  = cura2 - curb2 + realc;
  826. X
  827. X    cura2 = cura * cura;
  828. X    curb2 = curb * curb;
  829. X
  830. X    if (cura2+curb2 >= 16.0)
  831. X      return( k );
  832. X
  833. X    /* map real and imaginary parts into window coordinates */
  834. X
  835. X    x = x_center + (int)(x_scale*cura);
  836. X    y = y_center + (int)(y_scale*curb);
  837. X
  838. X    if ( x >= Pict->LeftMarg && x < Window->Width-Pict->RightMarg &&
  839. X         y >= Pict->TopMarg  && y < Window->Height-Pict->BotMarg ) {
  840. X
  841. X      /* plot pixel location */
  842. X
  843. X      WritePixel( Rp, x, y);
  844. X    }
  845. X
  846. X  }
  847. X  return( k );
  848. X}
  849. X
  850. X
  851. X
  852. SHAR_EOF
  853. echo "extracting mandint32.c"
  854. sed 's/^X//' << \SHAR_EOF > mandint32.c
  855. X/*
  856. X * MandelVroom 2.0
  857. X *
  858. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  859. X *
  860. X * All rights reserved.
  861. X *
  862. X * Permission is hereby granted to distribute this program's source
  863. X * executable, and documentation for non-comercial purposes, so long as the
  864. X * copyright notices are not removed from the sources, executable or
  865. X * documentation.  This program may not be distributed for a profit without
  866. X * the express written consent of the author Kevin L. Clague.
  867. X *
  868. X * This program is not in the public domain.
  869. X *
  870. X * Fred Fish is expressly granted permission to distribute this program's
  871. X * source and executable as part of the "Fred Fish freely redistributable
  872. X * Amiga software library."
  873. X *
  874. X * Permission is expressly granted for this program and it's source to be
  875. X * distributed as part of the Amicus Amiga software disks, and the
  876. X * First Amiga User Group's Hot Mix disks.
  877. X *
  878. X * contents: this file contains the functions to calculate Mandelbrot and
  879. X * Julia pictures using a special and fast fixed point (scaled ints) format.
  880. X * It has generators for 68000 and 68020 in assembly.
  881. X */
  882. X
  883. X#include "mandp.h"
  884. X
  885. X#include "parms.h"
  886. X
  887. X#define BITS2SHIFT 27
  888. X
  889. X/*
  890. X * 32 bit fixed point generator
  891. X */
  892. XMandelbrotInt32( Pict )
  893. X  register struct Picture *Pict;
  894. X{
  895. X  register LONG   i, j, k;
  896. X  register SHORT *CountPtr;
  897. X
  898. X  double gap;
  899. X
  900. X  UBYTE ConvFlag;
  901. X  LONG  gapx, gapy, startx;
  902. X
  903. X  struct IntPotParms Parms;
  904. X  struct RastPort   *Rp;
  905. X
  906. X  if (Pict->Flags & NO_RAM_GENERATE)
  907. X    CountPtr = Pict->Counts;
  908. X  else
  909. X    CountPtr = Pict->Counts + Pict->CurLine*Pict->CountX;
  910. X
  911. X  /* figure out horizontal and verticle distances between points in plane.
  912. X   * convert them to fixed point format                                    */
  913. X
  914. X  gapy = (int) (Pict->ImagGap*((double)(1<<BITS2SHIFT)));
  915. X  gapx = (int) (Pict->RealGap*((double)(1<<BITS2SHIFT)));
  916. X
  917. X  startx = (int)(Pict->RealLow*((double)(1<<BITS2SHIFT)));
  918. X
  919. X  /*
  920. X   * for each point in the image, calculate Mandelbrot
  921. X   */
  922. X  Parms.C_Imag = (int)(Pict->ImagLow*((double)(1<<BITS2SHIFT)));
  923. X
  924. X  Parms.C_Imag += Pict->CurLine*gapy;
  925. X
  926. X  Parms.ScreenReal = 0;
  927. X  Parms.ScreenImag = 0;
  928. X
  929. X  Parms.MaxIteration = Pict->MaxIteration;
  930. X
  931. X  for (i = Pict->CurLine; i < Pict->CountY; i++) {
  932. X
  933. X    Parms.C_Real = startx;
  934. X
  935. X    ConvFlag = 0;
  936. X
  937. X    if ( Pict->Flags & NO_RAM_GENERATE )
  938. X      CountPtr = Pict->Counts;
  939. X
  940. X    for (j = 0; j < Pict->CountX; j++) {
  941. X
  942. X      if (*CountPtr == 0) {
  943. X
  944. X        /*
  945. X         * if the last pixel was mandelbrot, then use trace table
  946. X         */
  947. X        if (ConvFlag) {
  948. X
  949. X          k = Int32_Trace_Height( &Parms );
  950. X        } else {
  951. X
  952. X          k = Int32_Height( &Parms );
  953. X        }
  954. X
  955. X        ConvFlag = k == Pict->MaxIteration;
  956. X        *CountPtr = k;
  957. X      }
  958. X      CountPtr++;
  959. X
  960. X      Parms.C_Real += gapx;
  961. X
  962. X      ChildPause( Pict );
  963. X    }
  964. X    Parms.C_Imag += gapy;
  965. X
  966. X    CheckEOL( Pict );
  967. X  }
  968. X} /* Mandelbrot32Int */
  969. X
  970. X#ifdef CHECK_TASK_STACK
  971. X
  972. Xint stackerr;
  973. XLONG stacklow;
  974. XLONG stackhi;
  975. XLONG stackovfl;
  976. XLONG stackmax;
  977. X
  978. XCheckStack() {
  979. X  register struct Task *Task;
  980. X  register LONG hi,reg,low;
  981. X  register LONG size;
  982. X
  983. X  Task = FindTask(0L);
  984. X
  985. X  hi = Task->tc_SPUpper;
  986. X  reg = Task->tc_SPReg;
  987. X  low = Task->tc_SPLower;
  988. X
  989. X  size = hi - reg;
  990. X
  991. X  if (reg < low) {
  992. X
  993. X    if (size > stackmax) {
  994. X      stackerr  = 1;
  995. X
  996. X      stacklow   = low;
  997. X      stackhi    = hi;
  998. X      stackovfl  = reg;
  999. X      stackmax   = size;
  1000. X    }
  1001. X  } else {
  1002. X
  1003. X    if (stackerr == 0 && size > stackmax) {
  1004. X      stacklow   = low;
  1005. X      stackhi    = hi;
  1006. X      stackovfl  = reg;
  1007. X      stackmax   = size;
  1008. X    }
  1009. X  }
  1010. X}
  1011. X
  1012. XPrintStack()
  1013. X{
  1014. X  if (stackerr != 0)
  1015. X    printf("********* STACK ERR ***********\n");
  1016. X
  1017. X  printf("Low   %08x\nHigh  %08x\nSP     %08x\n",
  1018. X          stacklow, stackhi, stackovfl );
  1019. X
  1020. X  printf("MinStack %d\n",stackmax);
  1021. X}
  1022. X
  1023. X#endif
  1024. X
  1025. X/*
  1026. X * 32 bit fixed point generator
  1027. X */
  1028. XJuliaInt32( Pict )
  1029. X  register struct Picture *Pict;
  1030. X{
  1031. X  register LONG   i, j, k;
  1032. X  register SHORT *CountPtr;
  1033. X
  1034. X  LONG  gapx, gapy, startx;
  1035. X  UBYTE ConvFlag;
  1036. X
  1037. X  struct IntPotParms Parms;
  1038. X
  1039. X  if (Pict->Flags & NO_RAM_GENERATE)
  1040. X    CountPtr = Pict->Counts;
  1041. X  else
  1042. X    CountPtr = Pict->Counts + (Pict->CurLine*Pict->CountX);
  1043. X
  1044. X  /* figure out horizontal and verticle distances between points in plane.
  1045. X   * convert them to fixed point format                                    */
  1046. X
  1047. X  gapx = (int) ( Pict->RealGap * (double) (1 << BITS2SHIFT) );
  1048. X  gapy = (int) ( Pict->ImagGap * (double) (1 << BITS2SHIFT) );
  1049. X
  1050. X  /*
  1051. X   * for each point in the image, calculate Julia
  1052. X   */
  1053. X  Parms.ScreenImag  = (int) ( Pict->ImagLow * (double) (1 << BITS2SHIFT) );
  1054. X  Parms.ScreenImag += Pict->CurLine*gapy;
  1055. X
  1056. X  startx = (int) ( Pict->RealLow * (double) (1 << BITS2SHIFT) );
  1057. X
  1058. X  Parms.C_Real = (int) ( Pict->Real * (double) (1 << BITS2SHIFT) );
  1059. X  Parms.C_Imag = (int) ( Pict->Imag * (double) (1 << BITS2SHIFT) );
  1060. X
  1061. X  Parms.MaxIteration = Pict->MaxIteration;
  1062. X
  1063. X  for (i = Pict->CurLine; i < Pict->CountY; i++) {
  1064. X
  1065. X    Parms.ScreenReal = startx;
  1066. X    ConvFlag = 0;
  1067. X
  1068. X    if ( Pict->Flags & NO_RAM_GENERATE )
  1069. X      CountPtr = Pict->Counts;
  1070. X
  1071. X    for (j = 0; j < Pict->CountX; j++) {
  1072. X
  1073. X      if (*CountPtr == 0) {
  1074. X
  1075. X        /*
  1076. X         * if the last pixel was mandelbrot, then use trace table
  1077. X         */
  1078. X
  1079. X        if ( ConvFlag ) {
  1080. X          k = Int32_Trace_Height( &Parms );
  1081. X        } else {
  1082. X          k = Int32_Height( &Parms );
  1083. X        }
  1084. X
  1085. X        ConvFlag = k == Pict->MaxIteration;
  1086. X        *CountPtr = k;
  1087. X      }
  1088. X      CountPtr++;
  1089. X
  1090. X      Parms.ScreenReal += gapx;
  1091. X
  1092. X      ChildPause( Pict );
  1093. X    }
  1094. X    Parms.ScreenImag += gapy;
  1095. X
  1096. X    CheckEOL( Pict );
  1097. X  }
  1098. X} /* Julia32Int */
  1099. X
  1100. X/*
  1101. X * 32 bit fixed point generator
  1102. X */
  1103. XMandelbrotInt32II( Pict )
  1104. X  register struct Picture *Pict;
  1105. X{
  1106. X  register LONG   i, j, k;
  1107. X  register struct RastPort *Rp;
  1108. X
  1109. X  double gap;
  1110. X
  1111. X  SHORT *CountPtr;
  1112. X  LONG  gapx, gapy, startx;
  1113. X
  1114. X  struct IntPotParms Parms;
  1115. X
  1116. X  if (Pict->Flags & NO_RAM_GENERATE)
  1117. X    CountPtr = Pict->Counts;
  1118. X  else
  1119. X    CountPtr = Pict->Counts + Pict->CurLine*Pict->CountX;
  1120. X
  1121. X  /* figure out horizontal and verticle distances between points in plane.
  1122. X   * convert them to fixed point format                                    */
  1123. X
  1124. X  gapy = (int) (Pict->ImagGap*((double)(1<<BITS2SHIFT)));
  1125. X  gapx = (int) (Pict->RealGap*((double)(1<<BITS2SHIFT)));
  1126. X
  1127. X  startx = (int)(Pict->RealLow*((double)(1<<BITS2SHIFT)));
  1128. X
  1129. X  /*
  1130. X   * for each point in the image, calculate Mandelbrot
  1131. X   */
  1132. X  Parms.C_Imag = (int)(Pict->ImagLow*((double)(1<<BITS2SHIFT)));
  1133. X  Parms.C_Imag += Pict->CurLine*gapy;
  1134. X
  1135. X  Parms.ScreenReal = 0;
  1136. X  Parms.ScreenImag = 0;
  1137. X
  1138. X  Parms.MaxIteration = Pict->MaxIteration;
  1139. X
  1140. X  for (i = Pict->CurLine; i < Pict->CountY; i++) {
  1141. X
  1142. X    Parms.C_Real = startx;
  1143. X
  1144. X    if ( Pict->Flags & NO_RAM_GENERATE )
  1145. X      CountPtr = Pict->Counts;
  1146. X
  1147. X    for (j = 0; j < Pict->CountX; j++) {
  1148. X
  1149. X      /*
  1150. X       * if the last pixel was mandelbrot, then use trace table
  1151. X       */
  1152. X
  1153. X      k = Int32_Height_Fast( &Parms );
  1154. X
  1155. X      *CountPtr++ = k;
  1156. X
  1157. X      Parms.C_Real += gapx;
  1158. X
  1159. X      ChildPause( Pict );
  1160. X    }
  1161. X    Parms.C_Imag += gapy;
  1162. X
  1163. X    CheckEOL( Pict );
  1164. X  }
  1165. X} /* MandelbrotInt32II */
  1166. X
  1167. X/*
  1168. X *  This code does mandelbrot without any trace lookup.
  1169. X *  It is the fastest 68000 generator in the house.
  1170. X */
  1171. XInt32_Height( Parms )
  1172. X
  1173. X  struct IntPotParms *Parms;
  1174. X{
  1175. X  LONG Height;
  1176. X
  1177. X  register struct IntPotParms *P = Parms;
  1178. X
  1179. X  register LONG cura, curb, cura2, curb2;
  1180. X
  1181. X#asm
  1182. Xheight  equ -4
  1183. XBits2Shift equ  5
  1184. X;
  1185. X;
  1186. X;  d1 - BITS2SHIFT
  1187. X;  d2 - k
  1188. X;  d4 - a
  1189. X;  d5 - b
  1190. X;  d6 - a2
  1191. X;  d7 - b2
  1192. X;
  1193. Xscreenr  equ 0
  1194. Xscreeni  equ 4
  1195. Xcurx     equ 8
  1196. Xcury     equ 12
  1197. Xmaxi     equ 16
  1198. X;
  1199. X   move.l   #Bits2Shift,d1
  1200. X   move.l   screenr(a2),d4
  1201. X   move.l   screeni(a2),d5
  1202. X   move.w   maxi(a2),d2
  1203. X   bra      Fposa2
  1204. X;
  1205. XFKLoop
  1206. X;
  1207. X;  cura = cura2 - curb2 + curx;
  1208. X   exg      d6,d4       ; exchange cura and cura2
  1209. X   sub.l    d7,d4       ; subtract curb
  1210. X   add.l    curx(a2),d4 ; add curx
  1211. X;
  1212. X;  curb = cura * curb >> 12;
  1213. X   move.l   d6,d7      ; get copy of op1 sign bit
  1214. X   bpl      Fpos1       ; get absolute value of op1
  1215. X   neg.l    d6
  1216. XFpos1
  1217. X   eor.l    d5,d7      ; calculate result sign
  1218. X   tst.l    d5         ; get absolute value of op2
  1219. X   bpl      Fpos2
  1220. X   neg.l    d5
  1221. XFpos2
  1222. X   move.l   d6,d0      ; get a copy of op1
  1223. X   swap     d0         ; get high half of op1
  1224. X   move.w   d0,d7      ; save a copy of high half
  1225. X   mulu     d5,d0      ; multiply op2 low by op1 high
  1226. X   clr.w    d0         ;  clear least significant part
  1227. X   swap     d0         ;  put it in it's place
  1228. X   swap     d5         ; get high half of op2
  1229. X   mulu     d5,d6      ; multiply op2 high with op1 low
  1230. X   clr.w    d6         ;  clear least significant part
  1231. X   swap     d6         ;  put it in its place
  1232. X   mulu     d7,d5      ; multiply op2 high by op1 high
  1233. X   add.l    d0,d5      ; add partial results
  1234. X   add.l    d6,d5      ; add partial results
  1235. X   tst.l    d7         ; is the result negative?
  1236. X   bpl      Fpos3
  1237. X   neg.l    d5         ; yes, better negate it.
  1238. XFpos3
  1239. X   asl.l    d1,d5      ; now, rescale it.
  1240. X;
  1241. X;  curb += curb + cury;
  1242. X   add.l    d5,d5      ; double it and add cury
  1243. X   add.l    cury(a2),d5
  1244. XFposa2
  1245. X;
  1246. X;  cura2 = cura * cura;
  1247. X   move.l   d4,d0      ; get absolute value of a in d0
  1248. X   bpl      Fposa
  1249. X   neg.l    d0
  1250. XFposa
  1251. X   move.l   d0,d6      ; copy absolute value into d6
  1252. X   swap     d6         ; get high part in d6
  1253. X   mulu     d6,d0      ; multiply high and low destroying low
  1254. X   clr.w    d0         ; clear the least significant part
  1255. X   swap     d0         ; put most sig. part in low half
  1256. X   mulu     d6,d6      ; multiply high and high destroing high
  1257. X   add.l    d0,d6      ; add in lower half twice
  1258. X   add.l    d0,d6
  1259. X   asl.l    d1,d6      ; get radix point back in correct place
  1260. X   bvs      Fbailout
  1261. X;
  1262. X;  curb2 = curb * curb;
  1263. X   move.l   d5,d0      ; get absolute value of a in d0
  1264. X   bpl      Fposb
  1265. X   neg.l    d0
  1266. XFposb
  1267. X   move.l   d0,d7      ; copy absolute value into d7
  1268. X   swap     d7         ; get high part in d7
  1269. X   mulu     d7,d0      ; multiply high and low destroying low
  1270. X   clr.w    d0         ; clear the least significant part
  1271. X   swap     d0         ; put most sig. part in low half
  1272. X   mulu     d7,d7      ; multiply high and high destroing high
  1273. X   add.l    d0,d7      ; add in lower half twice
  1274. X   add.l    d0,d7
  1275. X   asl.l    d1,d7      ; get radix point back in correct place
  1276. X   bvs      Fbailout
  1277. X;
  1278. X   move.l   d6,d0      ; if (cura2 + curb2 >= 4) goto bailout;
  1279. X   add.l    d7,d0
  1280. X   bvs      Fbailout
  1281. X;
  1282. X   dbra     d2,FKLoop
  1283. X;  addq     #1,d2
  1284. XFbailout
  1285. X   move.w   maxi(a2),d0
  1286. X   sub.w    d2,d0
  1287. X   sub.w    #1,d0
  1288. X   ext.l    d0
  1289. X#endasm
  1290. X   ;;
  1291. X}
  1292. X
  1293. XInt32_Trace_Height( Parms )
  1294. X
  1295. X  register struct IntPotParms *Parms;
  1296. X{
  1297. X  SHORT  k,TLen;
  1298. X  LONG  OldA[17];
  1299. X
  1300. X  register LONG cura, curb, cura2, curb2;
  1301. X
  1302. X#asm
  1303. X;
  1304. X;
  1305. X;  d1 - BITS2SHIFT
  1306. X;  d2 - k
  1307. X;  d4 - a
  1308. X;  d5 - b
  1309. X;  d6 - a2
  1310. X;  d7 - b2
  1311. X;  a0 - Trace Table pointer
  1312. X;
  1313. XTrace equ 16
  1314. XOldA  equ -132
  1315. Xk     equ -2
  1316. XTLen  equ -4
  1317. X
  1318. X   move.l   #Bits2Shift,d1
  1319. X   move.l   screenr(a2),d4
  1320. X   move.l   screeni(a2),d5
  1321. X;
  1322. X   lea      OldA(a5),a0          ; Set up Trace table pointer
  1323. X   move.w   #Trace,d2            ; Set up Trace table len
  1324. X;
  1325. X   move.w   #-1,k(a5)
  1326. X   bra      TPosa2               ; branch in to middle to get a2 = a * a
  1327. X;
  1328. XTLoop
  1329. X;
  1330. X;  cura = cura2 - curb2 + curx;
  1331. X   exg      d6,d4       ; exchange cura and cura2
  1332. X   sub.l    d7,d4       ; subtract curb
  1333. X   add.l    curx(a2),d4 ; add curx
  1334. X;
  1335. X;  curb = cura * curb >> 12;
  1336. X   move.l   d6,d7      ; get copy of op1 sign bit
  1337. X   bpl      TPos1       ; get absolute value of op1
  1338. X   neg.l    d6
  1339. XTPos1
  1340. X   eor.l    d5,d7      ; calculate result sign
  1341. X   tst.l    d5         ; get absolute value of op2
  1342. X   bpl      TPos2
  1343. X   neg.l    d5
  1344. XTPos2
  1345. X   move.l   d6,d0      ; get a copy of op1
  1346. X   swap     d0         ; get high half of op1
  1347. X   move.w   d0,d7      ; save a copy of high half
  1348. X   mulu     d5,d0      ; multiply op2 low by op1 high
  1349. X   clr.w    d0         ;  clear least significant part
  1350. X   swap     d0         ;  put it in it's place
  1351. X   swap     d5         ; get high half of op2
  1352. X   mulu     d5,d6      ; multiply op2 high with op1 low
  1353. X   clr.w    d6         ;  clear least significant part
  1354. X   swap     d6         ;  put it in its place
  1355. X   mulu     d7,d5      ; multiply op2 high by op1 high
  1356. X   add.l    d0,d5      ; add partial results
  1357. X   add.l    d6,d5      ; add partial results
  1358. X   tst.l    d7         ; is the result negative?
  1359. X   bpl      TPos3
  1360. X   neg.l    d5         ; yes, better negate it.
  1361. XTPos3
  1362. X   asl.l    d1,d5      ; now, rescale it.
  1363. X;
  1364. X;  curb += curb + cury;
  1365. X   add.l    d5,d5      ; double it and add cury
  1366. X   add.l    cury(a2),d5
  1367. XTPosa2
  1368. X;
  1369. X;  cura2 = cura * cura;
  1370. X   move.l   d4,d0      ; get absolute value of a in d0
  1371. X   bpl      TPosa
  1372. X   neg.l    d0
  1373. XTPosa
  1374. X   move.l   d0,d6      ; copy absolute value into d6
  1375. X   swap     d6         ; get high part in d6
  1376. X   mulu     d6,d0      ; multiply high and low destroying low
  1377. X   clr.w    d0         ; clear the least significant part
  1378. X   swap     d0         ; put most sig. part in low half
  1379. X   mulu     d6,d6      ; multiply high and high destroing high
  1380. X   add.l    d0,d6      ; add in lower half twice
  1381. X   add.l    d0,d6
  1382. X   asl.l    d1,d6      ; get radix point back in correct place
  1383. X   bvs      bailout
  1384. X;
  1385. X;  curb2 = curb * curb;
  1386. X   move.l   d5,d0      ; get absolute value of a in d0
  1387. X   bpl      TPosb
  1388. X   neg.l    d0
  1389. XTPosb
  1390. X   move.l   d0,d7      ; copy absolute value into d7
  1391. X   swap     d7         ; get high part in d7
  1392. X   mulu     d7,d0      ; multiply high and low destroying low
  1393. X   clr.w    d0         ; clear the least significant part
  1394. X   swap     d0         ; put most sig. part in low half
  1395. X   mulu     d7,d7      ; multiply high and high destroing high
  1396. X   add.l    d0,d7      ; add in lower half twice
  1397. X   add.l    d0,d7
  1398. X   asl.l    d1,d7      ; get radix point back in correct place
  1399. X   bvs      bailout
  1400. X
  1401. X   move.l   d6,d0      ; if (cura2 + curb2 >= 4) goto bailout;
  1402. X   add.l    d7,d0
  1403. X   bvs      bailout
  1404. X
  1405. X   move     d0,(a0)+   ; save magnitude in trace table
  1406. X
  1407. X   addq.w   #1,k(a5)   ; are we out of iterations?
  1408. X   move.w   maxi(a2),d0
  1409. X   cmp.w    k(a5),d0
  1410. X   ble      GotIt
  1411. X   dbra     d2,TLoop   ; nope, so try again till trace table full
  1412. X
  1413. X   move.w   -(a0),d0   ; get last entry in the trace
  1414. X
  1415. X   move.w   #Trace-1,d2  ; set up length and address for comparison loop
  1416. X   lea      OldA(a5),a0
  1417. X
  1418. XTCLoop
  1419. X   cmp      (a0)+,d0
  1420. X   beq      GotIt       ; did we find it?
  1421. X   dbra     d2,TCLoop
  1422. X
  1423. X   lea      OldA(a5),a0 ; no match, so prepare for the next round
  1424. X   move     d0,(a0)+    ; move last entry of the table
  1425. X
  1426. X   move.w   #Trace,d2
  1427. X   bra      TLoop
  1428. X
  1429. XGotIt
  1430. X   move.w   maxi(a2),k(a5)
  1431. Xbailout
  1432. X   move.w   k(a5),d0
  1433. X   ext.l    d0
  1434. X#endasm
  1435. X   ;;
  1436. X}
  1437. X
  1438. X/*
  1439. X * 32 bit fixed point generator
  1440. X */
  1441. XInt32_Height_Fast( Parms )
  1442. X  struct IntPotParms *Parms;
  1443. X{
  1444. X  register struct IntPotParms *P = Parms;
  1445. X  register LONG cura,curb,cura2,curb2;
  1446. X  /*
  1447. X   *  This is the fastest generator in the house.
  1448. X   */
  1449. X#asm
  1450. X   machine mc68020
  1451. Xfscreenr  equ 0
  1452. Xfscreeni  equ 4
  1453. Xfcurx     equ 8
  1454. Xfcury     equ 12
  1455. Xfmaxi     equ 16
  1456. X
  1457. XZcurx      equ   8
  1458. XZcury      equ  12
  1459. X;
  1460. X;  d1 - BITS2SHIFT
  1461. X;  d2 - k
  1462. X;  d4 - a
  1463. X;  d5 - b
  1464. X;  d6 - a2
  1465. X;  d7 - b2
  1466. X;
  1467. X;  cura = curb = curc = curd = 0;
  1468. X   move.w   maxi(a2),d1
  1469. X   move.l   #27,d2
  1470. X   move.l   fscreenr(a2),d4
  1471. X   move.l   fscreeni(a2),d5
  1472. X   move.l   fcurx(a2),a0
  1473. X   move.l   fcury(a2),a1
  1474. X   bra      Zpos2
  1475. X
  1476. XZLoop
  1477. X;
  1478. X;  cura = cura2 - curb2 + curx;
  1479. X;
  1480. X   exg      d6,d4
  1481. X   sub.l    d7,d4
  1482. X;   move.l   a0,d0
  1483. X   add.l    a0,d4
  1484. X;
  1485. X;  curb = cura * curb
  1486. X;
  1487. X   muls.l   d6,d0:d5
  1488. X   asl.l    #5,d0
  1489. X   lsr.l    d2,d5
  1490. X   or.l     d0,d5
  1491. X;
  1492. X;  curb += curb + cury;
  1493. X;
  1494. X   add.l    d5,d5
  1495. X;   move.l   a1,d0
  1496. X   add.l    a1,d5
  1497. XZpos2
  1498. X;
  1499. X;  cura2 = cura * cura;
  1500. X;
  1501. X   move.l   d4,d6
  1502. X   muls.l   d6,d0:d6
  1503. X   asl.l    #5,d0
  1504. X   bvs      Zbailout
  1505. X   lsr.l    d2,d6
  1506. X   or.l     d0,d6
  1507. X;
  1508. X;  curb2 = curb * curb;
  1509. X;
  1510. X   move.l   d5,d7
  1511. X   muls.l   d7,d0:d7
  1512. X   asl.l    #5,d0
  1513. X   bvs      Zbailout
  1514. X   lsr.l    d2,d7
  1515. X   or.l     d0,d7
  1516. X;
  1517. X   move.l   d6,d0
  1518. X   add.l    d7,d0
  1519. X   bvs      Zbailout
  1520. X;
  1521. X;  cmp.l    #536870912,d0
  1522. X;   bge      Zbailout
  1523. X;
  1524. X   dbra     d1,ZLoop
  1525. X;
  1526. X;  addq     #1,d1
  1527. XZbailout
  1528. X   move.w   fmaxi(a2),d0
  1529. X   sub.w    d1,d0
  1530. X   sub.w    #1,d0
  1531. X   ext.l    d0
  1532. X#endasm
  1533. X   ;
  1534. X}
  1535. SHAR_EOF
  1536. echo "extracting mandp.h"
  1537. sed 's/^X//' << \SHAR_EOF > mandp.h
  1538. X/*
  1539. X * MandelVroom 2.0
  1540. X *
  1541. X * (c) Copyright 1987,1989  Kevin L. Clague, San Jose, CA
  1542. X *
  1543. X * All rights reserved.
  1544. X *
  1545. X * Permission is hereby granted to distribute this program's source
  1546. X * executable, and documentation for non-comercial purposes, so long as the
  1547. X * copyright notices are not removed from the sources, executable or
  1548. X * documentation.  This program may not be distributed for a profit without
  1549. X * the express written consent of the author Kevin L. Clague.
  1550. X *
  1551. X * This program is not in the public domain.
  1552. X *
  1553. X * Fred Fish is expressly granted permission to distribute this program's
  1554. X * source and executable as part of the "Fred Fish freely redistributable
  1555. X * Amiga software library."
  1556. X *
  1557. X * Permission is expressly granted for this program and it's source to be
  1558. X * distributed as part of the Amicus Amiga software disks, and the
  1559. X * First Amiga User Group's Hot Mix disks.
  1560. X *
  1561. X * contents: this is the include file for MandelVroom standard includes.
  1562. X */
  1563. X
  1564. X#include <exec/types.h>
  1565. X#include <exec/lists.h>
  1566. X#include <exec/nodes.h>
  1567. X#include <exec/memory.h>
  1568. X#include <exec/execbase.h>
  1569. X#include <exec/semaphores.h>
  1570. X
  1571. X#include <graphics/display.h>
  1572. X#include <graphics/gfxbase.h>
  1573. X#include <graphics/gfx.h>
  1574. X#include <graphics/gfxmacros.h>
  1575. X
  1576. X#include <intuition/intuition.h>
  1577. X#include <intuition/intuitionbase.h>
  1578. X
  1579. X#include <workbench/startup.h>
  1580. X#include <workbench/workbench.h>
  1581. X
  1582. X#include <libraries/dosextens.h>
  1583. X
  1584. X#include <iff/ilbm.h>
  1585. X
  1586. X#include <stdio.h>
  1587. X#include <functions.h>
  1588. X
  1589. X/**************************************************************************
  1590. X *
  1591. X * color cycling stuff
  1592. X *
  1593. X *************************************************************************/
  1594. X
  1595. X#define EXDepth 6        /* Maximum depth (6=HAM) */
  1596. X#define maxColorReg 32
  1597. X#define maxCycles   4
  1598. X#define RNG_NORATE  36   /* Dpaint uses this rate to mean non-active */
  1599. X
  1600. X#define REVERSE 0x2
  1601. X
  1602. Xtypedef struct {
  1603. X   WORD  pad1;   /* future exp - store 0 here */
  1604. X   WORD  rate;   /* 60/sec=16384, 30/sec=8192, 1/sec=16384/60=273 */
  1605. X   WORD  active; /* lo bit 0=no cycle, 1=yes; next bit 1=rvs */
  1606. X   UBYTE low;    /* range lower */
  1607. X   UBYTE high;   /* range upper */
  1608. X   } CrngChunk;
  1609. X
  1610. X/*
  1611. X * Mandelvroom uses the gadget ID's to decode the meaning of
  1612. X * gadget related messages.  It uses a special encoding to indicate
  1613. X * what window, and function this gadget is associated with.
  1614. X *
  1615. X * I split the gadget id into three fields:
  1616. X *
  1617. X *    window type - indicates how the window is being used (e.g.
  1618. X *      contour or palette)
  1619. X *
  1620. X *    gadget type - general classification of gadget within the window
  1621. X *
  1622. X *    gadget number - in the case of an array of gadgets (like the pens
  1623. X *      in the color palette) this is the array index.
  1624. X */
  1625. X
  1626. X/*
  1627. X * This defines the bit positions of the fields within the gadget ID
  1628. X */
  1629. X
  1630. X#define WINDTYPEBITS 11
  1631. X#define TYPEBITS  6
  1632. X
  1633. X/*
  1634. X * These masks are used for extracting the fields from gadgetIDs
  1635. X * when messages are received.
  1636. X */
  1637. X
  1638. X#define WINDMASK 0xffff
  1639. X#define TYPEMASK 0xf
  1640. X#define NUMMASK 0x3f
  1641. X
  1642. X#define WIND_TYPE(g) ((g) >> WINDTYPEBITS & WINDMASK)
  1643. X#define GADG_TYPE(g) ((g) >> TYPEBITS & TYPEMASK)
  1644. X#define GADG_NUM(g)  ((g) & NUMMASK)
  1645. X#define CNT_NUM(a)   ((a)==CONTLAST ? NUMCONTS-1 : (a)+FirstContour)
  1646. X
  1647. X/*
  1648. X * These are the window types
  1649. X */
  1650. X
  1651. X#define PALTYPE   0 /* gadgetID indicates palette gadget */
  1652. X#define CONTYPE   1 /* gadgetID indicates contour gadget */
  1653. X#define PICTTYPE  2 /* gadgetID indicates picture gadget */
  1654. X#define HELPTYPE  3 /* gadgetID indicates help gadget */
  1655. X#define CYCTYPE   4 /* gadgetID indicates color cycling gadget */
  1656. X#define ORBTTYPE  5 /* gadgetID indicates orbit gadget */
  1657. X
  1658. X/*
  1659. X * These are the general classifications for palette gadgets
  1660. X */
  1661. X
  1662. X#define PALPENS  0   /* pen gadget in the palette */
  1663. X#define PALPOTS  1   /* Red, Green, Blue potentiometer gadgets */
  1664. X#define PALCNTLS 2   /* Controls (commands like copy, blend, exchange) */
  1665. X
  1666. X/*
  1667. X * Basis for individual ID expansion
  1668. X */
  1669. X
  1670. X#define PALPEN   (PALTYPE << WINDTYPEBITS | PALPENS  << TYPEBITS)
  1671. X#define PALPOT   (PALTYPE << WINDTYPEBITS | PALPOTS  << TYPEBITS)
  1672. X#define PALCNTL  (PALTYPE << WINDTYPEBITS | PALCNTLS << TYPEBITS)
  1673. X
  1674. X/*
  1675. X * These are the IDs for the command gadgets
  1676. X */
  1677. X
  1678. X#define PALCOPY  (PALCNTL | 0)
  1679. X#define PALRANGE (PALCNTL | 1)
  1680. X#define PALEXCG  (PALCNTL | 2)
  1681. X
  1682. X/*
  1683. X * Now we define the contour gadget IDs
  1684. X *
  1685. X * Start with the gadget types
  1686. X */
  1687. X
  1688. X#define CONTSELS  0  /* Contour window Pens */
  1689. X#define CONTUPS   1  /* Contour window increment gadget */
  1690. X#define CONTDOWNS 2  /* Contour window decrement gadget */
  1691. X#define CONTPOTS  3  /* Contour window potentiometer gadget */
  1692. X#define CONTCNTLS 4  /* Contour window controls */
  1693. X
  1694. X/*
  1695. X * Shift everything over so we can or in the specifics
  1696. X */
  1697. X
  1698. X#define CONTSEL  (CONTYPE << WINDTYPEBITS | CONTSELS  << TYPEBITS)
  1699. X#define CONTUP   (CONTYPE << WINDTYPEBITS | CONTUPS   << TYPEBITS)
  1700. X#define CONTDOWN (CONTYPE << WINDTYPEBITS | CONTDOWNS << TYPEBITS)
  1701. X#define CONTPOT  (CONTYPE << WINDTYPEBITS | CONTPOTS  << TYPEBITS)
  1702. X#define CONTCNTL (CONTYPE << WINDTYPEBITS | CONTCNTLS << TYPEBITS)
  1703. X
  1704. X#define CONTLAST  (CONTSEL | 32)
  1705. X
  1706. X/*
  1707. X * Make up the command gadgets IDs for the contour window
  1708. X */
  1709. X
  1710. X#define CONTRECOL (CONTCNTL | 0)
  1711. X#define CONTSET   (CONTCNTL | 1)
  1712. X#define CONTSMTH  (CONTCNTL | 2)
  1713. X#define CONTCUT   (CONTCNTL | 3)
  1714. X#define CONTCOPY  (CONTCNTL | 4)
  1715. X#define CONTPASTE (CONTCNTL | 5)
  1716. X#define CONTCEIL  (CONTCNTL | 9)
  1717. X#define CONTBAR   (CONTCNTL | 10)
  1718. X
  1719. X/*
  1720. X * Shift everything over so we can or in the specifics
  1721. X */
  1722. X
  1723. X#define PICTCUR   (PICTTYPE << WINDTYPEBITS | 0)
  1724. X#define PICTGEN   (PICTTYPE << WINDTYPEBITS | 1)
  1725. X#define PICTIN    (PICTTYPE << WINDTYPEBITS | 2)
  1726. X#define PICTOUT   (PICTTYPE << WINDTYPEBITS | 3)
  1727. X#define PICTJULIA (PICTTYPE << WINDTYPEBITS | 4)
  1728. X
  1729. X#define HELPUP     (HELPTYPE << WINDTYPEBITS | 0)
  1730. X#define HELPDOWN   (HELPTYPE << WINDTYPEBITS | 1)
  1731. X#define HELPSCROLL (HELPTYPE << WINDTYPEBITS | 2)
  1732. X
  1733. X/*
  1734. X * These are the general classifications for cycle gadgets
  1735. X */
  1736. X
  1737. X#define CYCRNUMS 0   /* cycle range indicators */
  1738. X#define CYCCNTLS 1   /* Controls (Range changer, direction, and speed) */
  1739. X
  1740. X/*
  1741. X * Basis for individual ID expansion
  1742. X */
  1743. X
  1744. X#define CYCRNUM  (CYCTYPE << WINDTYPEBITS | CYCRNUMS << TYPEBITS)
  1745. X#define CYCCNTL  (CYCTYPE << WINDTYPEBITS | CYCCNTLS << TYPEBITS)
  1746. X
  1747. X/*
  1748. X * These are the IDs for the command gadgets
  1749. X */
  1750. X
  1751. X#define CYCRANGE (CYCCNTL | 0)
  1752. X#define CYCDIR   (CYCCNTL | 1)
  1753. X#define CYCSPEED (CYCCNTL | 2)
  1754. X#define CYCON    (CYCCNTL | 3)
  1755. X
  1756. X#define ORBTCNTLS 0 /* controls (go into orbit mode) */
  1757. X#define ORBTMODE  (ORBTCNTLS | 0)
  1758. X
  1759. X/*
  1760. X * Now for some miscelaneous definitions
  1761. X *
  1762. X * Define the number of contours the system allows.
  1763. X */
  1764. X
  1765. X#define NUMCONTS    256  /* This is total number of contours */
  1766. X#define DISPCONTS    32  /* This is how many are displayable */
  1767. X
  1768. X#define VERSION 200
  1769. X
  1770. X/*
  1771. X * These definitions help us identify menu item selections.
  1772. X */
  1773. X
  1774. X/* Menu Project's, Items */
  1775. X#define NEWITEM      0
  1776. X#define CURITEM      1
  1777. X#define LOADITEM     2
  1778. X#define SAVEPROJ     3
  1779. X#define CLOSEPROJ    4
  1780. X#define SAVEILBM     5
  1781. X#define HELPITEM     6
  1782. X#define CANCELITEM   7
  1783. X#define QUITITEM     8
  1784. X
  1785. X/* Display Menu's Items */
  1786. X#define COLORITEM     0
  1787. X#define CYCLEITEM     1
  1788. X#define CONTOURITEM   2
  1789. X#define AUTOCNTRITEM  3
  1790. X#define HISTOGRAMITEM 4
  1791. X#define BORDERITEM    5
  1792. X#define DEPTHITEM     6
  1793. X#define VIEWMODEITEM  7
  1794. X#define SCREENITEM    8
  1795. X
  1796. X/* Menu: Edit, Item: ViewMode's, SubItems */
  1797. X#define HIRESSUB 0
  1798. X#define INTERLACESUB 1
  1799. X#define HALFBRITESUB 2
  1800. X
  1801. X/* Menu: Edit, Item: Depth's, SubItems */
  1802. X#define BITPLANE1SUB  0
  1803. X#define BITPLANES2SUB 1
  1804. X#define BITPLANES3SUB 2
  1805. X#define BITPLANES4SUB 3
  1806. X#define BITPLANES5SUB 4
  1807. X#define BITPLANES6SUB 5
  1808. X
  1809. X/* Menu: Edit, Item: Screen's SubItem */
  1810. X
  1811. X#define WBENCHSUB  0
  1812. X#define STANDARD   1
  1813. X
  1814. X/* Calculate Menu's Items */
  1815. X#define GENERATEITEM   0
  1816. X#define ZOOMITEM       1
  1817. X#define SCROLLITEM     2
  1818. X#define LENSITEM       3
  1819. X#define GENERATORITEM  4
  1820. X#define COUNTITEM      5
  1821. X#define STATSITEM      6
  1822. X
  1823. X/* Menu: Edit, Item: ZoomIn's, SubItems */
  1824. X#define ZOOMIN    0
  1825. X#define ZOOMOUT   1
  1826. X#define ZOOMOFF   2
  1827. X#define ZOOMJULIA 3
  1828. X
  1829. X/* Menu: Project, Item: Generate SubItems */
  1830. X#define STARTGEN     0
  1831. X#define STOPGEN      1
  1832. X#define CONTGEN      2
  1833. X
  1834. X/* Menu: Project, Item: Scroll SubItems */
  1835. X#define SETSCROLL    0
  1836. X#define GENSCROLL    1
  1837. X#define CANCELSCROLL 2
  1838. X
  1839. X/* Menu: Edit, Item: Generator, SubItems */
  1840. X#define INTGENERATOR   0
  1841. X#define FLOATGENERATOR 1
  1842. X#define IEEEGENERATOR  2
  1843. X#define INTIIGENERATOR 3
  1844. X#define _81GENERATOR   4
  1845. X
  1846. X/* Special Menu's Items */
  1847. X#define PRESETITEM     0
  1848. X#define ORBITITEM      1
  1849. X#define ORBITMATHITEM  2
  1850. X#define MAXORBITEM     3
  1851. X
  1852. X/* Menu: Special, Item: OrbitMode, subitems */
  1853. X#define INTORBIT  0
  1854. X#define FFPORBIT  1
  1855. X#define IEEEORBIT 2
  1856. X
  1857. X/* Menu Entries */
  1858. X#define PROJECTMENU    0
  1859. X#define DISPLAYMENU    1
  1860. X#define CALCULATEMENU  2
  1861. X#define SPECIALMENU    3
  1862. X
  1863. X#define TOGGLED11 0x0200
  1864. X
  1865. X/* State definitions */
  1866. X
  1867. X#define COPYRIGHTSTATE    0
  1868. X#define IDLESTATE         1
  1869. X#define COPYRGBSTATE      2
  1870. X#define SPREADRGBSTATE    3
  1871. X#define XCHGRGBSTATE      4
  1872. X#define SLIDERGBSTATE     5
  1873. X#define SETHEIGHTSTATE    6
  1874. X#define SETCONTSTATE      7
  1875. X#define SMOOTHCONTSTATE   8
  1876. X#define CUTCONTSTATE      9
  1877. X#define COPYCONTSTATE    10
  1878. X#define PASTECONTSTATE   11
  1879. X#define CEILINGSTATE     12
  1880. X#define SLIDEBARSTATE    13
  1881. X#define ORBITSTATE       14
  1882. X#define ZOOMINSTATE      15
  1883. X#define RESIZEZOOMSTATE  16
  1884. X#define PROPRESIZESTATE  17
  1885. X#define ZOOMDRAGSTATE    18
  1886. X#define QUERYHEIGHTSTATE 19
  1887. X#define SETJULIASTATE    20
  1888. X#define SLIDESPEEDSTATE  21
  1889. X#define CYCLERANGESTATE  22
  1890. X#define HELPSTATE        23
  1891. X#define SCROLLHELPSTATE  24
  1892. X#define SCROLLPICTSTATE  25
  1893. X
  1894. X#define PARSEOK      0
  1895. X#define PARSEBAD     1
  1896. X
  1897. X#define ZOOMCLOSEHIT  0
  1898. X#define ZOOMDRAGHIT   1
  1899. X#define ZOOMRESIZEHIT 2
  1900. X#define PROPRESIZEHIT 3
  1901. X#define NOTHINGHIT    4
  1902. X
  1903. X/***************************************************************************
  1904. X *
  1905. X *  Structure for Mandelbrot and Julia Pictures
  1906. X *
  1907. X **************************************************************************/
  1908. X
  1909. Xstruct Rect {
  1910. X  int Left, Top, Right, Bot;
  1911. X};
  1912. X
  1913. Xstruct Picture {
  1914. X  struct Node pNode;          /* for a linked list of pictures */
  1915. X
  1916. X  struct List    zList;       /* Pictures that have zoom     */
  1917. X                              /* open in this picture        */
  1918. X  struct Node    zNode;       /* Used to maintain the above  */
  1919. X
  1920. X  struct Picture *DrawPict;   /* Picture that zoom box is in */
  1921. X
  1922. X  UBYTE  ZoomType;            /* Zoom In or Out              */
  1923. X  int    NavTop,  NavBot;     /* Zoom box location and size  */
  1924. X  int    NavLeft, NavRight;
  1925. X
  1926. X
  1927. X  struct NewWindow *NewWind;  /* NewWindow structure         */
  1928. X  struct Window    *Window;   /* Open Intuition window       */
  1929. X
  1930. X  struct RastPort ScrollRp;   /* rastport for saved image during scroll */
  1931. X  struct BitMap   ScrollBitMap; /* bitmap for saved image */
  1932. X
  1933. X                              /* Window origin for scroll*/
  1934. X  struct Rect ImageLoc;       /* Scroll's image location in Pict->Window*/
  1935. X  struct Rect ClipImage;      /* location after clipping to Window */
  1936. X  struct Rect DataClip;       /* clipping also reflected in data */
  1937. X
  1938. X  struct Gadget    *SizingGadget; /* sizing place            */
  1939. X                              /* Sempahore for window        */
  1940. X  struct SignalSemaphore WindowSemi;
  1941. X
  1942. X  struct Gadget    *Gadgets;
  1943. X
  1944. X  char   Title[40];           /* Window Title                */
  1945. X
  1946. X  SHORT *Counts;              /* Pointer to data area. One   */
  1947. X  LONG   CountsSize;          /* SHORT per pixel.            */
  1948. X                              /* CountX * CountY * sizeof( SHORT ) */
  1949. X
  1950. X  ULONG  Flags;               /* Flags regarding Picture specifics */
  1951. X
  1952. X  int    LeftMarg,  TopMarg;
  1953. X  int    RightMarg, BotMarg;
  1954. X
  1955. X  struct Task     *gTask;     /* Task that generates this    */
  1956. X  LONG   gSigBit, gSigMask;   /* Signal to free up paused tasks */
  1957. X  UBYTE  GenState;            /* Task state                  */
  1958. X  UBYTE  GenChildState;       /* Task state                  */
  1959. X  int    CurLine;             /* Index of Line generator is on */
  1960. X
  1961. X  struct Task     *cTask;     /* Task for Recolor Slow       */
  1962. X  UBYTE  ColorState;          /* Task state                  */
  1963. X  UBYTE  ColorChildState;          /* Task state                  */
  1964. X
  1965. X  struct Histogram *Hist;     /* Projects Histogram structure */
  1966. X
  1967. X  SHORT OldMaxIter;           /* used for recalc */
  1968. X  LONG   TimeStamp[3];        /* Time stamp for calculation */
  1969. X
  1970. X  /***********************************************************/
  1971. X
  1972. X  double Real,     Imag;      /* For Julia only (Julia Seed) */
  1973. X                              /* Set it to 0.0 for Mand      */
  1974. X  double RealLow,  ImagLow;   /* Screen Boundaries for Julia */
  1975. X  double RealHigh, ImagHigh;  /* Complex Plane Origin for Mand */
  1976. X  double RealGap,  ImagGap;   /* Real and Imaginary parts of */
  1977. X
  1978. X  SHORT  LeftEdge, TopEdge;   /* Window position on screen   */
  1979. X  SHORT  CountX, CountY;      /* Picture dimensions          */
  1980. X
  1981. X  SHORT  MaxIteration;
  1982. X  UBYTE  MathMode;            /* Int32, FFP, IEEE            */
  1983. X
  1984. X  SHORT  Heights[256];        /* Contours' heights and pens  */
  1985. X  UBYTE  Pens[256];
  1986. X
  1987. X  UBYTE  ClrXlate[1024];      /* There are MaxIteration entries */
  1988. X
  1989. X  SHORT  RGBs[32];            /* Red, Green, Blue values     */
  1990. X  USHORT ViewModes;
  1991. X  SHORT  Depth;
  1992. X
  1993. X  SHORT  CycleOn;             /* Color Cycling stuff */
  1994. X  CrngChunk Crngs[maxCycles];
  1995. X};
  1996. X
  1997. X/* Picture.Types */
  1998. X
  1999. X#define JULIAPICT 1
  2000. X#define MANDPICT  2
  2001. X
  2002. X/* Picture Flags */
  2003. X
  2004. X#define NO_RAM_GENERATE 0x00000001
  2005. X#define LENS_DISPLAYED  0x00000002
  2006. X#define ZOOM_BOX_OPEN   0x00000004
  2007. X#define SCROLL_HAPPENED 0x00000008
  2008. X#define PROJECT_CHANGED 0x00000010
  2009. X#define BORDERLESS_PROJ 0x00000020
  2010. X
  2011. X#define GENPENDSTATE    1
  2012. X#define CONTINUESTATE   2
  2013. X#define GENERATESTATE   3
  2014. X#define PAUSESTATE      4
  2015. X#define FINISHEDSTATE   5
  2016. X#define KILLSTATE       6
  2017. X
  2018. X#define RECOLORINCOMPLETE 0
  2019. X#define RECOLORCOMPLETE   1
  2020. X
  2021. X#define GENINCOMPLETE 0
  2022. X#define GENCOMPLETE   1
  2023. X#define NOSIGSTATE    2
  2024. X
  2025. X#define INT1632MATH 0
  2026. X#define FFPMATH     1
  2027. X#define IEEEMATH    2
  2028. X#define INT3232MATH 3
  2029. X#define M68881MATH  4
  2030. X
  2031. X#define INTORBMATH  0
  2032. X#define FFPORBMATH  1
  2033. X#define IEEEORBMATH 2
  2034. X
  2035. X/***************************************************************************
  2036. X *
  2037. X *  External variables
  2038. X *
  2039. X **************************************************************************/
  2040. X
  2041. X/* These are global system variables */
  2042. X
  2043. Xextern struct Picture *CurPict;
  2044. X
  2045. Xextern int CurContour;
  2046. Xextern SHORT  NumContours;
  2047. X
  2048. Xextern LONG   TopMarg, BotMarg, LeftMarg, RightMarg;
  2049. X
  2050. Xextern struct Screen *screen;
  2051. Xextern struct ViewPort *vp;
  2052. Xextern int Num_vp_Colors;
  2053. X
  2054. Xextern struct Window *PalWind, *ContWind, *StatsWind, *HelpWind;
  2055. Xextern struct Window *HistWind,*CycWind, *OrbitWind;
  2056. Xextern struct Window *CurWind, *CurPlot, *ClosedWind, *BackWind;
  2057. X
  2058. Xextern struct Menu Menu[];
  2059. X
  2060. Xextern SHORT  XScale, YScale;
  2061. Xextern SHORT  MouseX, MouseY;
  2062. X
  2063. Xextern LONG CurPen;
  2064. X
  2065. Xextern UBYTE  ClosePlot;
  2066. Xextern UBYTE  QuitScreen;
  2067. X
  2068. Xextern LONG   mSigBit,mSigMask;
  2069. Xextern struct Task *mTask;
  2070. X
  2071. Xextern BYTE FromWB;
  2072. X
  2073. Xextern BYTE State, SubState, Parse_rc;
  2074. X
  2075. Xstruct Window *OpenMyWind();
  2076. X
  2077. Xstruct Gadget *MakeBool(), *MakePot(), *MakeString();
  2078. Xstruct IntuiText *MakeIntui(), *ShadowIntui();
  2079. Xstruct Border *ShadowBorder();
  2080. X
  2081. X#define AddSemaphore myAddSemaphore
  2082. X
  2083. X/*
  2084. X * Picture window ( Julia and Mandlebrot windows ) margins
  2085. X */
  2086. X
  2087. X#define TOPMARG   TopMarg
  2088. X#define BOTMARG   BotMarg
  2089. X#define LEFTMARG  LeftMarg
  2090. X#define RIGHTMARG RightMarg
  2091. X
  2092. X#define SUCCESSFUL   0
  2093. X#define UNSUCCESSFUL -1
  2094. X
  2095. X#define ChildPause(Pict) {if(Pict->GenState==PAUSESTATE)ChildSignal(Pict);}
  2096. X
  2097. X/**************************************************************************
  2098. X *
  2099. X * Histogram stuff
  2100. X *
  2101. X *************************************************************************/
  2102. X
  2103. Xstruct Histogram {
  2104. X  int *Table;
  2105. X  int  TableSize;
  2106. X};
  2107. X
  2108. X#define AllocHistStruct() (struct Histogram *)safeAllocMem(sizeof(struct Histogram), MEMF_CLEAR)
  2109. X#define FreeHistStruct(p) FreeMem(p,sizeof(struct Histogram))
  2110. X
  2111. X#define AllocHistTable(s) (int *)safeAllocMem(s*sizeof(int), MEMF_CLEAR)
  2112. X#define FreeHistTable(p)  FreeMem(p->Table,p->TableSize*sizeof(int))
  2113. X
  2114. X#define AddHead(List,Node) safeAddHead(List,Node,__FILE__,__LINE__,__FUNC__)
  2115. X#define Remove(Node)       safeRemove(Node,__FILE__,__LINE__,__FUNC__)
  2116. X
  2117. X/**************************************************************************
  2118. X *
  2119. X * standard stuff
  2120. X *
  2121. X *************************************************************************/
  2122. X
  2123. X#define BEVELEDUP    0
  2124. X#define BEVELEDDOWN  1
  2125. X
  2126. X#define NORMALPEN    1
  2127. X#define SHADOWPEN    3
  2128. X#define MEDIUMPEN    2
  2129. X#define HIGHLIGHTPEN 2
  2130. X#define POTPEN       3
  2131. X
  2132. X#ifdef MEM_DEBUG
  2133. X
  2134. X#include "safeallocmem.h"
  2135. X
  2136. X#else
  2137. X
  2138. XAPTR safeAllocMem();
  2139. X
  2140. X#endif
  2141. X
  2142. SHAR_EOF
  2143. echo "End of archive 5 (of 9)"
  2144. # if you want to concatenate archives, remove anything after this line
  2145. exit
  2146.